/*
 * Gramatica
 * 
 * Version 
 *
 * 23/10/2013
 * 
 * Licencia
 */
package proyecto2.logica;

import java.util.ArrayList;
import java.util.List;

public class Gramatica {

    List<Regla> reglas;
    DFA _miDFA;

    public Gramatica(DFA dfa) {
        reglas = new ArrayList<>();
        _miDFA = dfa;
        for (Transicion t : _miDFA.getTransiciones()) 
            reglas.add(new Regla(t.getOrigen(), t.getVariable(), t.getDestino(), t.getOrigen().ES_INICIAL(),t.getOrigen().ES_FINAL()));
    }

    public List< String> getDerivation(String s) {
        List<String> lista = new ArrayList<>();
        Estado actual = _miDFA.getInicial();
        String aux;
        for(int i = 0; i < s.length(); i++) {
            String subHilera =  String.valueOf(s.charAt(i));
            aux = actual.getId()+subHilera;
            actual = buscarEstado(actual, subHilera);
            aux+=actual.getId();
            lista.add(aux);
        }
        
        return lista;
    }

    private Estado buscarEstado(Estado actual, String subhilera){
        Estado siguiente = null;
        for (Transicion t : _miDFA.getTransiciones())  {
            if(t.getOrigen().equals(actual) && t.getVariable().equals(subhilera)) {
                siguiente = t.getDestino();
            }
        }
        return siguiente;
    } 
    

    public List<Regla> getReglas() {
        return reglas;
    }

    @Override
    public String toString() {
        return "Gramatica{" + "reglas=\n" + reglas + '}';
    }
}
